package demo4;

/**
 * Created with IntelliJ IDEA.
 * Description:
 * User: 姚东名
 * Date: 2024-06-11
 * Time: 20:50
 */

/**
 * 4. this引用
 */
//先看一个日期类的例子
class Data {
    public int year;
    public int month;
    public int day;

    public void setDay(int y, int m, int d) {
        year = y;
        month = m;
        day = d;
    }

    public void printData() {
        System.out.println(year + "-" + month + "-" + day);
    }

    public static void main(String[] args) {
        //构造三个日期类型的对象 data1 data2 data3
        Data data1 = new Data();
        Data data2 = new Data();
        Data data3 = new Data();

        //对data1 data2 data3的日期设置
        data1.setDay(2024, 6, 11);
        data2.setDay(2003, 8, 25);
        data3.setDay(2012, 2, 12);

        //打印日期中的内容
        data1.printData();
        data2.printData();
        data3.printData();
    }
}
class Data1 {
    public int year;
    public int month;
    public int day;

    public void setDay(Data1 this, int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public void printData(Data1 this) {
        System.out.println(this.year + "-" + this.month + "-" + this.day);
    }
}
class Data3 {
    public int year;
    public int month;
    public int day;

    public void setDay(int year, int month, int day) {
        this.year = year;
        this.month = month;
        this.day = day;
    }

    public void printData() {
        System.out.println(this.year + "-" + this.month + "-" + this.day);
    }
}
public class Test {
    //4.1为什么要有this引用
    /*
    先看一个日期类的例子
    以上代码定义了一个日期类，然后main方法中创建了三个对象，并通过Date类中的成员方法对对象进行设置和打
    印，代码整体逻辑非常简单，没有任何问题。
    但是细思之下有以下两个疑问：
        public void setDay(int year, int month, int day) {
        year = year;
        month = month;
        day = day;
    }

    1. 形参名不小心与成员变量名相同：
    2. 三个对象都在调用setDate和printDate函数，但是这两个函数中没有任何有关对象的说明，setDate和printDate函数如何知道打印的是那个对象的数据呢？
     */
    /*
    4.2什么是this引用
    this引用指的是当前对象(成员方法运行时调用该成员方法的对象)，在成员方法中所有成员变量的操作。都是通过该引用去访问。只不过所有的操作对用户是透明的，即用户不需要来传递，编译器自动完成。
     */
    public static void main(String[] args) {
        Data1 data1 = new Data1();
        data1.setDay(2024, 6, 11);
        data1.printData();
    }
    /*
    4.3this引用哪个对象的特性
    1. this的类型：对应类类型引用，即哪个对象调用就是哪个对象的引用类型
    2. this只能在“成员方法”中使用
    3. 在“成员方法”中，this只能引用当前对象，不能再引用其他对象
    4. this时“成员变量”第一个隐藏的参数，编译器会自动传递，在成员方法执行时，编译器会负责调用成员方法对象的引用传递给该成员方法，this负责来接收
     */
}
